// object表示一个js对象
let a: object;
a = {};
a = function () {
};  //一切皆是对象


//{} 用来指定对象中可以包含哪些属性
// 语法：{属性名:属性值,...}
let b: { name: string };
// b = {};   //必须有name属性
// b = {name:'name',age:18}; //也不能多

// 在属性名后加上?,表示这个属性是可选的
let b1: { name: string, age?: number };
b1 = {name: 'name1'};


// [propName: string]: any 表示任意类型的属性
let c: { name: string, [propName: string]: any };
c = {name: 'c_name', age: 18, gender: '男'};


/**
 * 设置函数结构的类型声明
 *      语法：(形参:类型,形参:类型,...) => 返回值
 */
let d: (a: number, b: number) => number;
d = function (n1, n2) {
    return n1 + n2;
}

// string[]表示字符串数组
let e: string[];
// e = ['a', 'b', 'c', 1, 2];
// number[]表示数值数组
let f: number[];
let g: Array<number>;
// g = [1, 2, 3, 'hello'];


/**
 * 元组(tuple)就是固定长度的数组
 *      语法：[类型,类型,...]
 */
let h: [string, string];

// h = ['hello', 'abc', 'cba'];


/**
 * enum枚举
 *
 */
enum Gender {
    Male, Female
}

let i: { name: string, gender: Gender };
i = {name: '孙悟空', gender: Gender.Male}
// console.log(i.gender === Gender.Male);


// &表示同时
let j: { name: string } & { age: number };
// j = {name: '孙悟空'};  //缺少age


//类型的别名
type myType = 1 | 2 | 3 | 4 | 5;
let m: myType;
m = 1;
// m = 6;

export {};